/*
==========
Cariddi
==========

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see http://www.gnu.org/licenses/.

	@Repository:  https://github.com/edoardottt/cariddi

	@Author:      edoardottt, https://www.edoardottt.com

	@License: https://github.com/edoardottt/cariddi/blob/main/LICENSE

*/

package output

import (
	"fmt"
	"html"
	"log"
	"os"
	"time"

	fileUtils "github.com/edoardottt/cariddi/internal/file"
)

const (
	HTMLBanner = `<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Cariddi Scan Results</title>
	<link href="https://fonts.googleapis.com/css2?family=Fira+Code&family=Inter:wght@400;600&display=swap" rel="stylesheet">
	<style>
		body {
			margin: 0;
			font-family: 'Inter', sans-serif;
			background-color: #f9fafb;
			color: #111827;
		}
		.header {
			background-color: #0ea5e9;
			color: white;
			padding: 2rem;
			text-align: center;
		}
		.header h1 {
			margin: 0;
			font-size: 2rem;
		}
		.header a {
			color: white;
			text-decoration: underline;
		}
		.container {
			padding: 2rem;
			max-width: 960px;
			margin: auto;
		}
		ul.meta {
			list-style: none;
			padding: 0;
			margin-top: 1rem;
		}
		ul.meta li {
			margin: 0.5rem 0;
		}
		code {
			font-family: 'Fira Code', monospace;
			background: #e2e8f0;
			padding: 2px 4px;
			border-radius: 4px;
		}
	</style>
</head>
<body>
	<div class="header">
		<h1>Cariddi - Security Scanner Report</h1>
		<ul class="meta">
			<li><a href="https://github.com/edoardottt/cariddi" target="_blank" rel="noopener noreferrer">github.com/edoardottt/cariddi</a></li>
			<li>by edoardottt - <a href="https://www.edoardottt.com" target="_blank" rel="noopener noreferrer">edoardottt.com</a></li>
			<li>Released under <a href="https://github.com/edoardottt/cariddi/blob/main/LICENSE" target="_blank" rel="noopener noreferrer">GPLv3 License</a></li>
		</ul>
	</div>
	<div class="container">`
	HTMLBannerFooter = `</div> <!-- End of .container -->
	<footer style="background-color: #e2e8f0; text-align: center; padding: 1.5rem; font-size: 0.9rem; color: #4b5563;">
		<p>Generated by <a href="https://github.com/edoardottt/cariddi" style="color: #0ea5e9; text-decoration: none;">Cariddi</a> – Stay safe out there! 🐙</p>
	</footer>
</body>
</html>`
)

// BannerHTML appends the initial banner to html file.
func BannerHTML(filename string) {
	file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}

	_, err = file.WriteString(HTMLBanner)
	if err != nil {
		log.Fatal(err)
	}

	file.Close()
}

// WriteSummaryCard adds a summary card.
func WriteSummaryCard(filename string, results, secrets, endpoints, extensions, errors, infos int) {
	file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}

	content := fmt.Sprintf(`<div class="summary-card">
	<h2>Scan Summary</h2>
	<p>Scan timestamp: %s</p>
	<ul>
		<li><strong>Results:</strong> %d</li>
		<li><strong>Secrets:</strong> %d</li>
		<li><strong>Endpoints:</strong> %d</li>
		<li><strong>Extensions:</strong> %d</li>
		<li><strong>Errors:</strong> %d</li>
		<li><strong>Info:</strong> %d</li>
	</ul>
</div>
`, time.Now().Format("2006-01-02 15:04:05"), results, secrets, endpoints, extensions, errors, infos)

	_, err = file.WriteString(content)
	if err != nil {
		file.Close()
		log.Println(err)
		os.Exit(1)
	}

	file.Close()
}

// AppendOutputToHTML appends the output to html file.
func AppendOutputToHTML(output string, status string, filename string, isLink bool) {
	file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}

	if isLink {
		var statusColor string

		if status != "" {
			if string(status[0]) == "2" || string(status[0]) == "3" {
				statusColor = "<p style='color:green;display:inline'>" + html.EscapeString(status) + "</p>"
			} else {
				statusColor = "<p style='color:red;display:inline'>" + html.EscapeString(status) + "</p>"
			}
		} else {
			statusColor = status
		}

		if _, err := file.WriteString("<li><a target='_blank' href='" +
			html.EscapeString(output) + "'>" +
			html.EscapeString(output) +
			"</a> " + html.EscapeString(statusColor) + "</li>\n"); err != nil {
			log.Fatal(err)
		}
	} else {
		if _, err := file.WriteString("<li>" + html.EscapeString(output) + "</li>\n"); err != nil {
			log.Fatal(err)
		}
	}

	file.Close()
}

// HeaderHTML appends the html header.
func HeaderHTML(header string, filename string) {
	file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}

	if _, err := file.WriteString("<h3>" + html.EscapeString(header) + "</h3><ul>\n"); err != nil {
		log.Fatal(err)
	}

	file.Close()
}

// FooterHTML appends the footer.
func FooterHTML(filename string) {
	file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}

	if _, err := file.WriteString("</ul>\n"); err != nil {
		log.Fatal(err)
	}

	file.Close()
}

// BannerFooterHTML appends the final footer.
func BannerFooterHTML(filename string) {
	file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
	if err != nil {
		log.Println(err)
	}

	_, err = file.WriteString(HTMLBannerFooter)
	if err != nil {
		log.Fatal(err)
	}

	file.Close()
}
